package com.zclever.kstarwar.service.impl;

import com.google.gson.Gson;
import com.zclever.kstarwar.dao.ExamDao;
import com.zclever.kstarwar.service.MessageService;
import com.zclever.kstarwar.vo.Exam;
import com.zclever.kstarwar.vo.Message;
import com.zclever.kstarwar.vo.User;
import com.zclever.kstarwar.websocket.WebSocketServer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 消息处理服务类
 * @author zclever
 * @email 304078606@qq.com
 * @date 2019/8/20
 */
@Service
public class MessageServiceImpl implements MessageService {

    private static final Logger logger = LogManager.getLogger(MessageServiceImpl.class);

    @Resource
    ExamDao examDao;

    @Override
    public void dealMessage(User user,Message message) {

        logger.info("处理用户消息:{},{}",user,message);

        switch (message.getType()){
            case 1: //请求战斗
                requestFight(user,message);
                break;
            case 2: //接受战斗
                acceptFight(user,message);
                break;
            case 5: //战斗结束
                finishFight(user,message);
                break;
            case 66: //修改用户名
                saveUname(user,message);
                break;
            default:
                defaultMessage(user,message);
        }
    }

    private void saveUname(User user, Message message) {
        logger.info("修改用户名:{},{}",user,message);

        user.setUname(message.getContent().toString());
    }

    /**
     * 战斗结束
     * @param user
     * @param message
     */
    private void finishFight(User user, Message message) {
        logger.info("战斗结束:{},{}",user,message);

        user.setGaming(false);
    }

    /**
     * 接受战斗
     * @param message
     * @param user
     */
    private void acceptFight(User user,Message message) {
        logger.info("用户接受战斗:{},{}",user,message);

        //我方设置为游戏中状态
        user.setGaming(true);
        //对方设置为游戏中状态
        WebSocketServer.getWebSocketSet().forEach(server->{
            User u = server.getUser();
            if(u.getUid()==message.getToUid()){
                u.setGaming(true);
            }
        });

        //查询题目
        List<Exam> list = examDao.findAll();
        //打乱题目
        Collections.shuffle(list);
        //清空options字段,todo 以后可以用GsonBuilder的@Expose字段忽略
        list.forEach(exam -> exam.setOptions(null));

        //给敌方推送题目
        List<Exam> l = new ArrayList<>();
        l.add(list.get(0));
        l.add(list.get(1));
        l.add(list.get(2));
        message.setType(21);
        message.setContent(l);
        defaultMessage(user,message);

        //给我方推送题目
        l = new ArrayList<>();
        l.add(list.get(3));
        l.add(list.get(4));
        l.add(list.get(5));
        message.setType(21);
        message.setToUid(message.getUser().getUid());
        message.setContent(l);
        defaultMessage(user,message);
    }

    /**
     * 我方请求战斗
     * @param message
     * @param user
     */
    private void requestFight(User user,Message message) {
        logger.info("用户请求战斗:{},{}",user,message);

        //我方设置为请求战斗状态
        user.setRequesting(true);

        if(message.getToUid()>0){
            //发给对应用户
            //对方接受进入战斗

        }else{

            //寻找请求战斗的对手或机器人
            //双方进入战斗

            //寻找在线对手
            //给对方发送请求战斗申请

            //寻找机器人
            //我方进去战斗
        }

        defaultMessage(user,message);
    }

    /**
     * 默认消息处理
     * @param message
     * @param user
     */
    private void defaultMessage(User user,Message message) {
        logger.info("发送用户消息:{},{}",user,message);

        //如果用户改名及时保存 todo 存入数据库
        user.setUname(message.getUser().getUname());

        WebSocketServer.getWebSocketSet().forEach(server -> {

            if( server.getUser().getUid() == message.getToUid()){
                try {
                    server.sendMessage(message);
                } catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }
}
